package springframework.beans.factory.support;

import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanNameGenerator;
import org.springframework.util.ClassUtils;


/**
* "xxxImpl"のように、末尾が"Impl"で終わるクラスを、"Impl"を除いた名称でBean登録する。
* @author NDSS fushimi
*/
public class ImplBeanNameGenerator implements BeanNameGenerator
{

   /**
    * 登録対象クラスのサフィックス
    */
   private static final String IMPL_SUFFIX = "Impl";


   /**
    * beanの登録名を生成します。
    * 末尾が"Impl"の場合は"Impl"をカットした名称で登録します。
    * 
    * @see BeanNameGenerator#generateBeanName(BeanDefinition,
    *      BeanDefinitionRegistry)
    */
   public String generateBeanName( BeanDefinition definition, BeanDefinitionRegistry registry )
   {
       try
       {
           String propertyName = ClassUtils.getShortNameAsProperty( Class.forName( definition.getBeanClassName() ) );
           int pos = propertyName.indexOf( IMPL_SUFFIX );
           if ( pos == -1 )
               return propertyName;
           return propertyName.substring( 0, pos );

       }
       catch ( ClassNotFoundException e )
       {
           throw new IllegalStateException( "Class " + definition.getBeanClassName() + " not found." );
       }
   }

}
